package com.xzkj.ad

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.text.TextUtils
import android.view.ViewGroup
import com.google.gson.Gson
import com.ifmvo.togetherad.core.TogetherAd
import com.ifmvo.togetherad.core.listener.BannerListener
import com.ifmvo.togetherad.core.listener.InterListener
import com.ifmvo.togetherad.core.listener.RewardListener
import com.ifmvo.togetherad.csj.TogetherAdCsj
import com.ifmvo.togetherad.gdt.TogetherAdGdt
import com.orhanobut.MyLog
import com.xzkj.sp.SpUtils
import org.json.JSONObject
import java.util.LinkedHashMap

@SuppressLint("StaticFieldLeak")
object AdManager {

    lateinit var context: Context

    /**
     * 广告开关，1：打开，0：关闭
     */
    var adSw = 1

    /**
     * 尽量放在 Application 的 onCreate 方法中初始化，否则可能会影响填充率
     */
    @JvmStatic
    fun init(context: Context,csjBean:BaseConfig,gdtBean:BaseConfig) {
        this.context = context
        val initConfig = InitConfig()
        val map = LinkedHashMap<String, Int>()
        //拿到本地保存的广告json配置。判断是否包含ratio，如果包含，说明使用本地写死的广告位，如果不包含就使用json配置。
        val localAdJson = SpUtils.get(context, AdConst.LOCAL_AD_JSON, "")

        if (TextUtils.isEmpty(localAdJson)) {
            //说明第一次启动，使用默认的,配置默认的广告位。
            processConfig(initConfig, map,csjBean,gdtBean)
            //配置默认的比例
            initRatio(initConfig,map,10,1,0,0)
        } else {
            //说明本地已经保存了广告配置,判断是否包含ratio，如果包含，说明使用本地写死的广告位，如果不包含就使用json配置。
            if (localAdJson.contains("ratio")) {
                //配置的只有比例，使用默认的写死的广告位
                processConfig(initConfig, map,csjBean,gdtBean)
                //解析比例
                val extendRatio = Gson().fromJson(localAdJson, ExtendRatio::class.java)
                //设置开关
                adSw = extendRatio.adSw
                val ratioStrs = extendRatio.ratio.split(",")
                if (ratioStrs.size == 4) {
                    //有四个比例,设置四个比例
                    initRatio(initConfig,map,ratioStrs[0].toInt(),ratioStrs[1].toInt(),ratioStrs[2].toInt(),ratioStrs[3].toInt())
                }

            } else if (localAdJson.contains("csj")) {
                //配置了广告位，没有appid。appid本地写死
                val extendAdConfig = Gson().fromJson(localAdJson, ExtendAdConfig::class.java)
                adSw = extendAdConfig.adSw
                val csjStr = extendAdConfig.csj
                val ylhStr = extendAdConfig.ylh
                val bqtStr = extendAdConfig.bqt
                val ksStr = extendAdConfig.ks
                val csjAllIds = csjStr.split(",")
                val ylhAllIds = ylhStr.split(",")
                val bqtAllIds = bqtStr.split(",")
                val ksAllIds = ksStr.split(",")
                if (csjAllIds.size > 4 && ylhAllIds.size > 4 && bqtAllIds.size > 4 && ksAllIds.size > 4){
                    initConfig.csjConfig = BaseConfig("5217127", csjAllIds[0], csjAllIds[1], csjAllIds[2], csjAllIds[3])
                    initConfig.gdtConfig = BaseConfig("1200511777", ylhAllIds[0], ylhAllIds[1], ylhAllIds[2], ylhAllIds[3])
//                    initConfig.baiduConfig = BaseConfig("e71abb0a", bqtAllIds[0], bqtAllIds[1], bqtAllIds[2], bqtAllIds[3])
//                    initConfig.ksConfig = BaseConfig()
                    initRatio(initConfig,map,csjAllIds[4].toInt(),ylhAllIds[4].toInt(),bqtAllIds[4].toInt(),ksAllIds[4].toInt())
                }

            } else {
                //不知道l配置了什么东西，无法解析。就使用默认的写死的广告位
                processConfig(initConfig, map,csjBean,gdtBean)
                //配置默认的比例
                initRatio(initConfig,map,10,1,0,0)
            }

        }
        val csjConfig = initConfig.csjConfig
        val gdtConfig = initConfig.gdtConfig
//        val baiduConfig = initConfig.baiduConfig
//        val ksConfig = initConfig.ksConfig

        //初始化穿山甲
        TogetherAdCsj.init(
            context = context,
            adProviderType = AdProviderType.CSJ.type,
            csjAdAppId = csjConfig.appId,
            appName = context.getString(R.string.app_name)
        )
        //初始化广点通
        TogetherAdGdt.init(
            context = context,
            adProviderType = AdProviderType.GDT.type,
            gdtAdAppId = gdtConfig.appId
        )
        //初始化百青藤
//        TogetherAdBaidu.init(
//            context = context,
//            adProviderType = AdProviderType.BAIDU.type,
//            baiduAdAppId = baiduConfig.appId
//        )
//        //初始化快手
//        TogetherAdKs.init(
//            context = context,
//            adProviderType = AdProviderType.KS.type,
//            ksAdAppId = ksConfig.appId
//        )

        /**
         * 配置所有广告位ID
         * 如果你的ID是服务器下发，也可以把配置ID放在其他位置，但是必须要在请求广告之前完成配置，否则无法加载广告
         */
        TogetherAdCsj.idMapCsj = config2Map(csjConfig)

        TogetherAdGdt.idMapGDT = config2Map(gdtConfig)

//        TogetherAdKs.idMapKs = mutableMapOf(
//            TogetherAdAlias.AD_SPLASH to ksConfig.spId.toLong(),
//            TogetherAdAlias.AD_REWARD to ksConfig.reId.toLong(),
//            TogetherAdAlias.AD_BANNER to ksConfig.baId.toLong(),
//            TogetherAdAlias.AD_INTER to ksConfig.inId.toLong()
//        )
//
//        TogetherAdBaidu.idMapBaidu = config2Map(baiduConfig)

        val ratioPublicMap = initConfig.ratioPublicMap
        if (!ratioPublicMap.isNullOrEmpty()) {
            TogetherAd.setPublicProviderRatio(ratioPublicMap)
        }
    }

    /**
     * 默认实例化广告广告位
     * @param initConfig InitConfig
     * @param map LinkedHashMap<String, Int>
     */
    fun processConfig(initConfig: InitConfig, map: LinkedHashMap<String, Int>,csjBean:BaseConfig,gdtBean:BaseConfig) {
        initConfig.csjConfig = csjBean
        initConfig.gdtConfig =  gdtBean
//        initConfig.csjConfig =
//            BaseConfig("5217127", "887573350", "948036817", "948140216", "948036835")
//        initConfig.gdtConfig = BaseConfig(
//            "1200511777",
//            "5013724620719254",
//            "8083129786157951",
//            "7043328786245955",
//            "6094399362750265"
//        )
//        initConfig.baiduConfig =
//            BaseConfig("e71abb0a", "8053642", "8059860", "8059856", "8059861")
//        initConfig.ksConfig = BaseConfig()
    }

    /**
     * 设置广告比例
     * @param initConfig InitConfig
     * @param map LinkedHashMap<String, Int>
     * @param csjRatio Int
     * @param ylhRatio Int
     * @param bqtRatio Int
     * @param ksRatio Int
     */
    fun initRatio(initConfig: InitConfig, map: LinkedHashMap<String, Int>, csjRatio: Int,ylhRatio: Int,bqtRatio: Int,ksRatio: Int){
        map[AdProviderType.CSJ.type] = csjRatio
        map[AdProviderType.GDT.type] = ylhRatio
//        map[AdProviderType.BAIDU.type] = bqtRatio
//        map[AdProviderType.KS.type] = ksRatio
        initConfig.ratioPublicMap = map
    }

    /**
     * 保存所有广告配置数据。包含比例，各个广告位的id，还有总开关
     * @param context Context
     * @param adConfigJson String 加密的字符串
     */
    fun setAdConfig(context: Context, adConfigJson: String) {
        try {
            MyLog.e("配置表》》》》" + adConfigJson)
            SpUtils.put(context, AdConst.LOCAL_AD_JSON, adConfigJson)
            val json = JSONObject(adConfigJson)
            adSw = json.getInt("adSw")
            //重置广告配置请求失败的次数
            SpUtils.put(context, AdConst.SPLASH_AD_NUM, 0)
        } catch (e: Exception) {

        }
    }

    /**
     * 服务器接口请求失败次数。用来判断是否加载开屏广告。如果>=2就加载开屏广告。
     */
    fun setSplashADNum(context: Context) {
        try {
            var splashADNum = SpUtils.get(context, AdConst.SPLASH_AD_NUM, 0)
            splashADNum++
            SpUtils.put(context, AdConst.SPLASH_AD_NUM, splashADNum)
        } catch (e: Exception) {

        }
    }

    /**
     * 服务器接口请求失败次数。用来判断是否加载开屏广告。如果》=2就加载开屏广告。
     */
    fun getSplashADNum(context: Context): Int {
        return SpUtils.get(context, AdConst.SPLASH_AD_NUM, 0)
    }

    private fun config2Map(baseConfig: BaseConfig): MutableMap<String, String> {
        return mutableMapOf(
            TogetherAdAlias.AD_SPLASH to baseConfig.spId,
            TogetherAdAlias.AD_REWARD to baseConfig.reId,
            TogetherAdAlias.AD_BANNER to baseConfig.baId,
            TogetherAdAlias.AD_INTER to baseConfig.inId
        )
    }

    fun loadSplashAD(
        activity: Activity,
        adContainer: ViewGroup,
        mainActClass: Class<out Activity>
    ) {
        SplashAd.show(activity, adContainer, mainActClass)
    }

    fun loadBannerAD(activity: Activity, adContainer: ViewGroup, listener: BannerListener? = null) {
        if (adSw == 0) {
            return
        }
        BannerAd.show(activity, adContainer, listener)
    }

    fun loadRewardAD(activity: Activity, listener: RewardListener? = null) {
        if (adSw == 0) {
            return
        }
        RewardAd.loadAndShow(activity, listener)
    }

    fun loadInterAD(activity: Activity, listener: InterListener? = null) {
        if (adSw == 0) {
            return
        }
        InterAd.loadAndShow(activity, listener)
    }


}